package com.devshephard.juchm.threadPool;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;

/**
 * invokeAll,调用传入list中的所有任务
 */
public class TestInvokeAll {

    public static void main(String[] args) throws InterruptedException {

        //由于线程池中的核心线程只有两个,所以三个任务可能会限制其并行度(有一个多余的线程会加入到阻塞队列)
        ExecutorService pool = Executors.newFixedThreadPool(2);

        List<Future<Object>> futures = pool.invokeAll(Arrays.asList(
                () -> {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println("first");
                    return "1";
                },

                () -> {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println("second");
                    return "2";
                },

                () -> {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println("thrid");
                    return "3";
                }
        ));

        futures.forEach(item -> {
            try {
                //调用future.get()方法,则会将调用线程阻塞等待,等待线程完成后继续执行
                //当有多个future调用get()方法时,则会并行等待(并非顺序等待)
                item.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });

        System.out.println("main");
    }

}

